package ec.edu.ups.cidi.siia.plamdep.modelo.analizadorLexico;
import java.util.ArrayList;
import java.util.List;

import ec.edu.ups.cidi.siia.plamdep.analizadorLexico.analisis.Recursos;
import ec.edu.ups.cidi.siia.plamdep.analizadorLexico.wordnet.WordNet;
public class Palabra 
{
    //propiedades de la clase
    private String palabra;
    private List<String> sinonimos=new ArrayList<String> ();
    private List<String> antonimos=new ArrayList<String> ();
    private List<String> traducciones=new ArrayList<String> ();
    private List<String> significados=new ArrayList<String> ();
    private String tipo="";
    private String lema;
    
    //banderas para saber si las consultas a la base ya fueron realizadas
    private boolean isSinonimosCargados=false;
    private boolean isAntonimosCargados=false;
    private boolean isSignificadoCargado=false;
    private boolean isTipoCargado=false;
    private boolean isLemaCargado=false;
    private boolean isTraduccionCargado=false;
    private WordNet wordnet=new WordNet();
    
    public Palabra(String palabra) 
    {
        this.palabra = palabra;
    }
    public Palabra(String palabra, boolean cargar) 
    {
        this.palabra = palabra;
    }
    /**
     * Metodo que devuelve la palabra que originalmente se creo 
     * @return String
     */
    public String getPalabra() 
    {
        return palabra;
    }
    /**
     * Metodo que devuelve un arreglo de strings con los "SINONIMOS" de la palabra, esta operacion lo hace realizando una consulta a la base de datos de wordnet.
     * @return String
     */
    public List<String> getSinonimos() 
    {
        if(this.isSinonimosCargados==false) 
        {   sinonimos=wordnet.getSinonimos(this.palabra,this.getLema());
            this.isSinonimosCargados=true;
        }
        return sinonimos;
    }
    
    
    public List<String> getTraducciones() 
    {
        if(this.isTraduccionCargado==false) 
        {   traducciones= wordnet.getEngTraduccion(this.getLema());
            this.isTraduccionCargado=true;
        }
        return traducciones;
    }
    
    
    /**
     * Metodo que devuelve un arreglo de strings con los "ANTONIMOS" de la palabra, esta operacion lo hace realizando una consulta a la base de datos de wordnet.
     * @return String
     */
    
    public List<String> getAntonimos() 
    {
        if(this.isAntonimosCargados==false)
        {
            antonimos= wordnet.getAntonimos(this.getLema());
            this.isAntonimosCargados=true;
        }    
        return antonimos;
    }
      
    public void setTipo(String tipo)
    {
        this.tipo=tipo;
    }
     public List<String> getSignificados() 
    {
        if(this.isSignificadoCargado==false)
        {
           significados= wordnet.getSignificados(this.getLema());
            this.isSignificadoCargado=true;
        }  
        return significados;
    }
     /**
     * Metodo que devuelve el tipo de la palabra segun freeling.
     * @return String
     */
    public String getTipo() 
    {
        if(this.tipo.trim().equalsIgnoreCase(""))
        {
            this.analizarFreling();
            this.isTipoCargado=true;
        }    
        return tipo;
    }
    /**
     * Metodo que usa freeling para buscar el tag que le corresponde Puede estar duera de contexto
     */
    private void analizarFreling()
    {
      Palabra aux=Recursos.freeling.analisis(this.palabra).get(0);
      this.tipo=aux.getTipo();
      this.lema=aux.getLema();
    }
    
    public String toString(){
        return this.palabra;
    }

    /**
     * @return the lema
     */
    public String getLema() {
		 if(this.tipo.trim().equalsIgnoreCase(""))
	     {
	         this.analizarFreling();
	         this.isLemaCargado=true;
	     }  
    	
        return lema;
    }

    /**
     * @param lema the lema to set
     */
    public void setLema(String lema) {
        this.lema = lema;
    }
}